package ar.uba.fi.tecnicas.testing;

import java.util.ArrayList;
import java.util.List;

import ar.uba.fi.tecnicas.fabrica.*;
import ar.uba.fi.tecnicas.juego.Jugador;
import junit.framework.TestCase;

public class MercadoTest extends TestCase 
{
	private TipoMateriaPrima azucar = new TipoMateriaPrima("Azucar",5,"kg");
	private TipoMateriaPrima arroz = new TipoMateriaPrima("Arroz",3.5,"kg");
	private TipoMateriaPrima harina = new TipoMateriaPrima("Harina",2.5,"kg");

	public void setUp() 
	{
		Mercado.instancia.nuevoTipoMateriaPrima(azucar);
		Mercado.instancia.nuevoTipoMateriaPrima(arroz);
		Mercado.instancia.nuevoTipoMateriaPrima(harina);
	}

	public void testCantidadProductoMercado()
	{
		int cantElementos = Mercado.instancia.getTiposMateriaPrima().size();
		assertEquals(3, cantElementos);
	}
	
	public void testObtenerProductosEnPrecio()
	{
		List<TipoMateriaPrima> productos = Mercado.instancia.getTiposMateriaPrimaEnPrecio(3.5);
		assertEquals(2, productos.size());
	}
	
	public void testObtenerPrecioProducto()
	{
		assertEquals(3.5, Mercado.instancia.getTipoMateriaPrima(arroz.getNombre()).getPrecio(), 0.0);
	}
	
	public void testEfectuarCompra()
	{
		ArrayList<TipoMateriaPrima> compras = new ArrayList<TipoMateriaPrima>();
		ArrayList<Double> cantidades = new ArrayList<Double>();
		
		compras.add(azucar);
		compras.add(harina);
		
		cantidades.add(2.0);
		cantidades.add(5.0);
		
		Jugador jugador = new Jugador("J", 30.5);
		
		jugador.restarGastos(Mercado.instancia.efectuarCompra(compras, cantidades));
		
		assertEquals(8, jugador.getCapital(), 0.0);
	}
	
	public void testEfectuarCompra2()
	{
		ArrayList<TipoMateriaPrima> compras=new ArrayList<TipoMateriaPrima>();
		ArrayList<Double> cantidades=new ArrayList<Double>();
		double cantidad;
		
		compras.add(azucar);
		compras.add(harina);
		cantidades.add(2.0);
		cantidades.add(5.0);
		
		Almacen.instancia.agregarNuevaMateriaPrima(new MateriaPrima(azucar, 5));
		
		Mercado.instancia.efectuarCompra(compras, cantidades);
		
		cantidad = Almacen.instancia.getMateriaPrima(azucar).getCantidad();
		
		assertEquals(7.0,cantidad,0);
	}
	
	public void testExisteDineroParaCompra()
	{
		ArrayList<TipoMateriaPrima> compras=new ArrayList<TipoMateriaPrima>();
		ArrayList<Double> cantidades=new ArrayList<Double>();
		
		compras.add(azucar);
		compras.add(harina);
		cantidades.add(2.0);
		cantidades.add(5.0);

		Jugador jugador = new Jugador("J", 30);

		Mercado.instancia.efectuarCompra(compras, cantidades);
		
		assertTrue(jugador.getCapital() >= 0);
		
	}
	
	public void tearDown() 
	{
		Mercado.instancia.getTiposMateriaPrima().clear();
		Almacen.instancia.getMateriasPrimas().clear();
	}	
}
